home *** CD-ROM | disk | FTP | other *** search
-
- OPT P=68030,O+,L2,W-
-
- xdef _V_Init,_V_Close,_V_Fin
- xdef _V_Plot,_V_Rect,_V_Box
- xdef _get_200
-
- clip_x1 = 0
- clip_y1 = 2
- clip_x2 = 4
- clip_y2 = 6
- clip_slen = 8
-
- true_bit = 2
- hires_bit = 3
- vga_bit = 4
- pal_bit = 5
- os_bit = 6
- compat_bit = 7
- lace_bit = 8
-
- bpl1 = 0
- bpl2 = 1
- bpl4 = 2
- bpl8 = 3
- true = 4
-
- hires = 1<<hires_bit
- vga = 1<<vga_bit
- pal = 1<<pal_bit
- os = 1<<os_bit
- compat = 1<<compat_bit
- lace = 1<<lace_bit
-
-
- push macro
- move.\0 \1,-(sp)
- endm
-
- pop macro
- move.\0 (sp)+,\1
- endm
-
- pushall macro
- movem.l d0-a6,-(sp)
- endm
-
- popall macro
- movem.l (sp)+,d0-a6
- endm
-
- *---------------------------------------*
- * Initialise rendering display *
- *---------------------------------------*
- _V_Init:
- *---------------------------------------*
- pushall
- *---------------------------------------*
- rsreset
- *---------------------------------------*
- .local_regs rs.l 15
- *---------------------------------------*
- .local_rts rs.l 1
- *---------------------------------------*
- rs.w 1
- .local_width rs.w 1
- *---------------------------------------*
- rs.w 1
- .local_height rs.w 1
- *---------------------------------------*
- .local_options rs.l 1
- *---------------------------------------*
- rs.b 3
- .local_format rs.b 1
- *---------------------------------------*
- move.w .local_width(sp),render_width
- move.w .local_height(sp),render_height
- move.l .local_options(sp),render_options
- move.b .local_format(sp),render_format
- *---------------------------------------*
- * Start screen blanker *
- *---------------------------------------*
- tst.l render_options
- beq.s .cont
- *---------------------------------------*
- tst.b blanker_active
- bne .error
- st blanker_active
- *---------------------------------------*
- push.w #37
- trap #14
- addq.l #2,sp
- pea blanker_on
- push.w #38
- trap #14
- addq.l #6,sp
- *---------------------------------------*
- bra .error
- *---------------------------------------*
- .cont:
- *---------------------------------------*
- * 320x200/320x240 *
- *---------------------------------------*
- move.w #true,default_modecode
- *---------------------------------------*
- cmp.b #'H',render_format
- beq.s .hig
- cmp.b #'h',render_format
- beq.s .hig
- cmp.b #'M',render_format
- beq.s .med
- cmp.b #'m',render_format
- bne.s .low
- *---------------------------------------*
- .med:
- *---------------------------------------*
- * 320x400/320x480 *
- *---------------------------------------*
- move.w #true|lace,default_modecode
- bra.s .low
- *---------------------------------------*
- .hig:
- *---------------------------------------*
- * 640x400/640x480 *
- *---------------------------------------*
- move.w #true|lace|hires,default_modecode
- *---------------------------------------*
- .low:
- *---------------------------------------*
- bsr flush_keybuffer
- *---------------------------------------*
- tst.b display_active
- bne .error
- *---------------------------------------*
- * Disable cursor *
- *---------------------------------------*
- pea con_init
- push.w #9
- trap #1
- addq.l #6,sp
- *---------------------------------------*
- * Store original screen config *
- *---------------------------------------*
- push.w #2
- trap #14
- addq.l #2,sp
- move.l d0,os_screen
- push.w #-1
- push.w #88
- trap #14
- addq.l #4,sp
- move.w d0,os_modecode
- push.w d0
- push.w #91
- trap #14
- addq.l #4,sp
- move.l d0,os_screen_size
- *---------------------------------------*
- * Store original palette *
- *---------------------------------------*
- bsr save_palette
- *---------------------------------------*
- * Choose new video modecode *
- *---------------------------------------*
- move.w #vga|pal,d0
- move.w d0,d1
- not.w d0
- and.w os_modecode,d1
- and.w default_modecode,d0
- or.w d1,d0
- btst #vga_bit,d0
- beq.s .nvga
- bclr #pal_bit,d0
- eor.w #lace,d0
- .nvga:
- move.w d0,modecode
- *---------------------------------------*
- * Allocate space for screen *
- *---------------------------------------*
- push.w d0
- push.w #91
- trap #14
- addq.l #4,sp
- move.l d0,phys_size
- add.l #(256+256),d0
- push.w #0
- push.l d0
- push.w #68
- trap #1
- addq.l #8,sp
- tst.l d0
- beq .error
- move.l d0,phys_handle
- add.l #256-1,d0
- clr.b d0
- move.l d0,phys_screen
- *---------------------------------------*
- * Clear screen *
- *---------------------------------------*
- move.l d0,a0
- move.l phys_size,d0
- lsr.l #2,d0
- bsr clear_longs
- *---------------------------------------*
- * Switch to new video mode *
- *---------------------------------------*
- move.l phys_screen,a0
- move.w modecode,d0
- jsr set_video
- *---------------------------------------*
- * Work out screen dimensions *
- *---------------------------------------*
- jsr get_width
- *---------------------------------------*
- * Calculate plotting dimensions *
- *---------------------------------------*
- clr.b hscale
- clr.b vscale
- *---------------------------------------*
- move.w screen_w,d1
- move.w screen_h,d2
- swap d1
- swap d2
- clr.w d1
- clr.w d2
- divu.w #160,d1
- divu.w #120,d2
- swap d2
- move.w d2,d0
- clr.w d2
- ext.l d0
- divu.l d1,d0:d2
- cmp.l #$00018000,d2
- bmi.s .square
- addq.b #1,hscale
- *---------------------------------------*
- .square:
- *---------------------------------------*
- moveq #0,d3
- moveq #0,d4
- move.b hscale,d3
- move.b vscale,d4
- move.w render_width,d1
- lsr.w d3,d1
- move.w render_height,d2
- lsr.w d4,d2
- .loop:
- cmp.w screen_w,d1
- ble.s .x_in
- addq.b #1,hscale
- addq.b #1,vscale
- lsr.w d1
- lsr.w d2
- bra.s .loop
- .x_in:
- cmp.w screen_h,d2
- ble.s .y_in
- addq.b #1,hscale
- addq.b #1,vscale
- lsr.w d1
- lsr.w d2
- bra.s .loop
- .y_in:
- lea clipping_window,a1
- move.w #0,clip_x1(a1)
- move.w #0,clip_y1(a1)
- move.w d1,clip_x2(a1)
- move.w d2,clip_y2(a1)
- *---------------------------------------*
- * Calculate centering *
- *---------------------------------------*
- neg.w d1
- add.w screen_w,d1
- lsr.w d1
- neg.w d2
- add.w screen_h,d2
- lsr.w d2
- mulu.w linelen,d2
- ext.l d1
- add.l d1,d2
- add.l d2,d2
- move.l phys_screen,a1
- add.l d2,a1
- move.l a1,plot_screen
- *---------------------------------------*
- st display_active
- *---------------------------------------*
- .error:
- *---------------------------------------*
- popall
- *---------------------------------------*
- rts
-
- *---------------------------------------*
- blanker_on:
- *---------------------------------------*
- move.w $FFFF82A4.w,old_v1
- move.w $FFFF82A6.w,old_v2
- move.w $FFFF82A8.w,old_v3
- move.w $FFFF82A2.w,$FFFF82A4.w
- move.w $FFFF82A2.w,$FFFF82A6.w
- move.w #-1,$FFFF82A8.w
- rts
-
- *---------------------------------------*
- blanker_off:
- *---------------------------------------*
- move.w old_v1,$FFFF82A4.w
- move.w old_v2,$FFFF82A6.w
- move.w old_v3,$FFFF82A8.w
- rts
-
- *---------------------------------------*
- _V_Close:
- *---------------------------------------*
- pushall
- *---------------------------------------*
- bsr flush_keybuffer
- *---------------------------------------*
- * Check screenblanker *
- *---------------------------------------*
- tst.b blanker_active
- beq.s .cont
- sf blanker_active
- *---------------------------------------*
- push.w #37
- trap #14
- addq.l #2,sp
- pea blanker_off
- push.w #38
- trap #14
- addq.l #6,sp
- *---------------------------------------*
- bra.s .error
- *---------------------------------------*
- .cont:
- *---------------------------------------*
- tst.b display_active
- beq .error
- sf display_active
- *---------------------------------------*
- move.l os_screen,a0
- move.w os_modecode,d0
- bsr set_video
- *---------------------------------------*
- bsr restore_palette
- *---------------------------------------*
- push.l phys_handle
- push.w #73
- trap #1
- addq.l #6,sp
- *---------------------------------------*
- * Reset console *
- *---------------------------------------*
- pea con_reset
- push.w #9
- trap #1
- addq.l #6,sp
- *---------------------------------------*
- .error:
- *---------------------------------------*
- popall
- *---------------------------------------*
- rts
-
- *---------------------------------------*
- _V_Fin:
- *---------------------------------------*
- pushall
- push.w #7
- trap #1
- addq.l #2,sp
- popall
- rts
-
- *---------------------------------------*
- _V_Plot:
- *---------------------------------------*
- movem.l d0-d2/a0,-(sp)
- *---------------------------------------*
- rsreset
- *---------------------------------------*
- .local_regs rs.l 4
- *---------------------------------------*
- .local_rts rs.l 1
- *---------------------------------------*
- rs.w 1
- .local_x rs.w 1
- *---------------------------------------*
- rs.w 1
- .local_y rs.w 1
- *---------------------------------------*
- rs.b 3
- .local_r rs.b 1
- *---------------------------------------*
- rs.b 3
- .local_g rs.b 1
- *---------------------------------------*
- rs.b 3
- .local_b rs.b 1
- *---------------------------------------*
- move.w .local_x(sp),d0
- move.b hscale,d2
- lsr.w d2,d0
- move.w .local_y(sp),d1
- move.b vscale,d2
- lsr.w d2,d1
- mulu.w linelen,d1
- ext.l d0
- move.l plot_screen,a0
- add.l d1,d0
- move.b .local_r(sp),d2
- bfins d2,d1{16:08}
- move.b .local_g(sp),d2
- bfins d2,d1{21:08}
- move.b .local_b(sp),d2
- bfins d2,d1{27:08}
- move.w d1,(a0,d0.l*2)
- *---------------------------------------*
- movem.l (sp)+,d0-d2/a0
- rts
-
- *---------------------------------------*
- _V_Rect:
- *---------------------------------------*
- pushall
- *---------------------------------------*
- rsreset
- *---------------------------------------*
- .local_regs rs.l 15
- *---------------------------------------*
- .local_rts rs.l 1
- *---------------------------------------*
- rs.w 1
- .local_x1 rs.w 1
- *---------------------------------------*
- rs.w 1
- .local_x2 rs.w 1
- *---------------------------------------*
- rs.w 1
- .local_y1 rs.w 1
- *---------------------------------------*
- rs.w 1
- .local_y2 rs.w 1
- *---------------------------------------*
- rs.b 3
- .local_r rs.b 1
- *---------------------------------------*
- rs.b 3
- .local_g rs.b 1
- *---------------------------------------*
- rs.b 3
- .local_b rs.b 1
- *---------------------------------------*
- move.w .local_x1(sp),d1
- move.w .local_y1(sp),d2
- move.w .local_x2(sp),d3
- move.w .local_y2(sp),d4
- move.b .local_r(sp),red
- move.b .local_g(sp),grn
- move.b .local_b(sp),blu
- move.b hscale,d0
- lsr.w d0,d1
- lsr.w d0,d3
- move.b vscale,d0
- lsr.w d0,d2
- lsr.w d0,d4
- addq.w #1,d3
- addq.w #1,d4
- lea clipping_window,a1
- bsr sbox_clipped
- popall
- rts
-
- *---------------------------------------*
- _V_Box:
- *---------------------------------------*
- pushall
- *---------------------------------------*
- rsreset
- *---------------------------------------*
- .local_regs rs.l 15
- *---------------------------------------*
- .local_rts rs.l 1
- *---------------------------------------*
- rs.w 1
- .local_x1 rs.w 1
- *---------------------------------------*
- rs.w 1
- .local_y1 rs.w 1
- *---------------------------------------*
- rs.w 1
- .local_x2 rs.w 1
- *---------------------------------------*
- rs.w 1
- .local_y2 rs.w 1
- *---------------------------------------*
- rs.b 3
- .local_r rs.b 1
- *---------------------------------------*
- rs.b 3
- .local_g rs.b 1
- *---------------------------------------*
- rs.b 3
- .local_b rs.b 1
- *---------------------------------------*
- move.w .local_x1(sp),d1
- move.w .local_y1(sp),d2
- move.w .local_x2(sp),d3
- move.w .local_y2(sp),d4
-
- move.b .local_r(sp),red
- move.b .local_g(sp),grn
- move.b .local_b(sp),blu
-
- move.b hscale,d0
- lsr.w d0,d1
- lsr.w d0,d3
-
- move.b vscale,d0
- lsr.w d0,d2
- lsr.w d0,d4
-
- subq.l #clip_slen,sp
- move.w d1,clip_x1(sp)
- move.w d2,clip_y1(sp)
- move.w d3,clip_x2(sp)
- move.w d4,clip_y2(sp)
-
- lea clipping_window,a1
-
- move.w clip_x1(sp),d1
- move.w d1,d3
- move.w clip_y1(sp),d2
- move.w clip_y2(sp),d4
- addq.w #1,d3
- addq.w #1,d4
- bsr sbox_clipped
-
- move.w clip_x2(sp),d1
- move.w d1,d3
- move.w clip_y1(sp),d2
- move.w clip_y2(sp),d4
- addq.w #1,d3
- addq.w #1,d4
- bsr sbox_clipped
-
- move.w clip_x1(sp),d1
- move.w clip_x2(sp),d3
- move.w clip_y1(sp),d2
- move.w d2,d4
- addq.w #1,d3
- addq.w #1,d4
- bsr sbox_clipped
-
- move.w clip_x1(sp),d1
- move.w clip_x2(sp),d3
- move.w clip_y2(sp),d2
- move.w d2,d4
- addq.w #1,d3
- addq.w #1,d4
- bsr sbox_clipped
-
- addq.l #clip_slen,sp
-
- popall
- rts
-
- *---------------------------------------*
- save_palette:
- *---------------------------------------*
- move.w os_modecode,d0
- btst #true_bit,d0
- bne.s .err
- and.w #%111,d0
- moveq #2,d1
- bra.s .strt
- .shft:
- mulu.w d1,d1
- .strt:
- dbra d0,.shft
- pea os_palette
- push.w d1
- push.w #0
- push.w #94
- trap #14
- lea 10(sp),sp
- .err:
- rts
-
- *---------------------------------------*
- restore_palette:
- *---------------------------------------*
- move.w os_modecode,d0
- btst #true_bit,d0
- bne.s .err
- and.w #%111,d0
- moveq #2,d1
- bra.s .strt
- .shft:
- mulu.w d1,d1
- .strt:
- dbra d0,.shft
- pea os_palette
- push.w d1
- push.w #0
- push.w #93
- trap #14
- lea 10(sp),sp
- .err:
- rts
-
-
- *---------------------------------------*
- * Calculate horizontal video size *
- *---------------------------------------*
- get_width:
- *---------------------------------------*
- pea .local(pc)
- push.w #38
- trap #14
- addq.l #6,sp
- rts
- .local:
- moveq #0,d1
- move.w $FFFF8210.w,d1
- move.w d1,screen_w
- move.w d1,linelen
- add.l d1,d1
- move.w d1,linesize
- move.l phys_size,d0
- divu.l d1,d0
- move.w d0,screen_h
- rts
-
- *-------------------------------------------------------*
- set_video:
- *-------------------------------------------------------*
- push.w #-1
- push.l a0
- push.l a0
- *-------------------------------------------------------*
- push.w d0
- push.w #3
- pea 0.w
- pea 0.w
- push.w #5
- trap #14
- lea 14(sp),sp
- *-------------------------------------------------------*
- push.w #5
- trap #14
- lea 12(sp),sp
-
- ; push.w d0
- ; push.w #-1
- ; push.l a0
- ; push.l a0
- ; push.w #5
- ; trap #14
- ; lea 12(sp),sp
- ; push.w #88
- ; trap #14
- ; addq.l #4,sp
-
- rts
-
- *---------------------------------------------------------------*
- clear_longs:
- *---------------------------------------------------------------*
- movem.l d1-d7/a2-a3,-(sp)
- moveq #0,d2
- move.l d2,d3
- move.l d2,d4
- move.l d2,d5
- move.l d2,d6
- move.l d2,d7
- move.l d2,a2
- move.l d2,a3
- moveq #128-1,d1
- and.l d0,d1
- bra.s .strt
- .long:
- move.l d2,(a0)+
- .strt:
- dbra d1,.long
- lsr.l #7,d0
- move.l d0,d1
- lsl.l #8,d1 ; *256
- lsl.l #1,d1 ; *2 = *512
- add.l d1,a0
- bra.s .next
- .clr:
- movem.l d2-d7/a2-a3,-(a0) ; 4*8*16 = 512
- movem.l d2-d7/a2-a3,-(a0)
- movem.l d2-d7/a2-a3,-(a0)
- movem.l d2-d7/a2-a3,-(a0)
- movem.l d2-d7/a2-a3,-(a0)
- movem.l d2-d7/a2-a3,-(a0)
- movem.l d2-d7/a2-a3,-(a0)
- movem.l d2-d7/a2-a3,-(a0)
- movem.l d2-d7/a2-a3,-(a0)
- movem.l d2-d7/a2-a3,-(a0)
- movem.l d2-d7/a2-a3,-(a0)
- movem.l d2-d7/a2-a3,-(a0)
- movem.l d2-d7/a2-a3,-(a0)
- movem.l d2-d7/a2-a3,-(a0)
- movem.l d2-d7/a2-a3,-(a0)
- movem.l d2-d7/a2-a3,-(a0)
- .next:
- dbra d0,.clr
- movem.l (sp)+,d1-d7/a2-a3
- rts
-
- *---------------------------------------*
- flush_keybuffer:
- *---------------------------------------*
- .all:
- push.w #11
- trap #1
- addq.l #2,sp
- tst.w d0
- beq.s .exit
- push.w #7
- trap #1
- addq.l #2,sp
- bra.s .all
- .exit:
- rts
-
-
- *-------------------------------------------------------*
- sbox_clipped_end:
- *-------------------------------------------------------*
- rts
-
- *-------------------------------------------------------*
- sbox_clipped:
- *-------------------------------------------------------*
- move.l (a1)+,d5
- cmp.w d1,d3
- bge.s .xok
- exg d1,d3
- .xok: move.l (a1)+,d6
- cmp.w d2,d4
- bge.s .yok
- exg d2,d4
- .yok: subq.l #clip_slen,a1
- swap d5
- cmp.w d5,d3
- bmi.s sbox_clipped_end
- cmp.w d5,d1
- bpl.s .x1in
- move.w d5,d1
- .x1in: swap d5
- cmp.w d5,d4
- bmi.s sbox_clipped_end
- cmp.w d5,d2
- bpl.s .y1in
- move.w d5,d2
- .y1in: swap d6
- cmp.w d6,d1
- bpl.s sbox_clipped_end
- cmp.w d6,d3
- bmi.s .x2in
- move.w d6,d3
- .x2in: swap d6
- cmp.w d6,d2
- bpl.s sbox_clipped_end
- cmp.w d6,d4
- bmi.s .y2in
- move.w d6,d4
- .y2in:
-
- *-------------------------------------------------------*
- sbox_primitive:
- *-------------------------------------------------------*
- push.l a0
- push.l a1
- *-------------------------------------------------------*
- * Check size *
- *-------------------------------------------------------*
- sub.w d1,d3
- ble sbox_end
- sub.w d2,d4
- ble sbox_end
- *-------------------------------------------------------*
- * Address screen location *
- *-------------------------------------------------------*
- move.l plot_screen,a0
- move.w d2,d6
- mulu.w linelen,d6
- ext.l d1
- add.l d1,d6
- add.l d6,d6
- add.l d6,a0
- *-------------------------------------------------------*
- * Calculate line-wrap increment *
- *-------------------------------------------------------*
- move.w linelen,d2
- sub.w d3,d2
- ext.l d2
- add.l d2,d2
- move.l d2,a2
- *-------------------------------------------------------*
- * Look up colour *
- *-------------------------------------------------------*
- move.b red,d1
- bfins d1,d2{16:8}
- move.b grn,d1
- bfins d1,d2{21:8}
- move.b blu,d1
- bfins d1,d2{27:8}
- move.w d2,d0
- swap d0
- move.w d2,d0
- *-------------------------------------------------------*
- * Render filled box *
- *-------------------------------------------------------*
- subq.w #1,d4
- moveq #8-1,d5
- and.w d3,d5
- lsr.w #3,d3
- neg.w d5
- lea .jmp(pc,d5.w*2),a1
- .olp: move.w d3,d2
- jmp (a1)
- .block: move.l d0,(a0)+
- move.l d0,(a0)+
- move.l d0,(a0)+
- move.l d0,(a0)+
- dbra d2,.block
- add.l a2,a0
- dbra d4,.olp
- bra.s sbox_end
- move.w d0,(a0)+
- move.w d0,(a0)+
- move.w d0,(a0)+
- move.w d0,(a0)+
- move.w d0,(a0)+
- move.w d0,(a0)+
- move.w d0,(a0)+
- move.w d0,(a0)+
- .jmp: dbra d2,.block
- add.l a2,a0
- dbra d4,.olp
- *-------------------------------------------------------*
- sbox_end:
- *-------------------------------------------------------*
- pop.l a1
- pop.l a0
- rts
-
- *-------------------------------------------------------*
- _get_200:
- *-------------------------------------------------------*
- movem.l d1-d2/a0-a2,-(sp)
- pea .loc
- push.w #38
- trap #14
- addq.l #6,sp
- movem.l (sp)+,d1-d2/a0-a2
- move.l clock,d0
- rts
- .loc: move.l $4BA.w,clock
- rts
-
- *---------------------------------------*
- cnop 0,4
- *---------------------------------------*
- data
- *---------------------------------------*
-
- con_init: dc.b 27,"f",0
- con_reset: dc.b 27,"e",0
- even
-
- default_modecode: dc.w true|lace
- display_active: ds.w 1
-
- *---------------------------------------*
- cnop 0,4
- *---------------------------------------*
- bss
- *---------------------------------------*
-
- os_palette: ds.l 256
- xb_palette: ds.l 256
-
- os_screen: ds.l 1
- os_screen_size: ds.l 1
- os_screen_clone: ds.l 1
-
- clock: ds.l 1
-
- phys_size: ds.l 1
- phys_handle: ds.l 1
- phys_screen: ds.l 1
- plot_screen: ds.l 1
-
- linesize: ds.l 1
-
- render_format: ds.l 1
- render_width: ds.l 1
- render_height: ds.l 1
- render_options: ds.l 1
-
- linelen: ds.l 1
- modecode: ds.l 1
- screen_w: ds.l 1
- screen_h: ds.l 1
-
- os_modecode: ds.l 1
- os_screen_w: ds.l 1
- os_screen_h: ds.l 1
-
- hscale: ds.l 1
- vscale: ds.l 1
-
- red: ds.l 1
- grn: ds.l 1
- blu: ds.l 1
-
- old_v1: ds.l 1
- old_v2: ds.l 1
- old_v3: ds.l 1
-
- monitor_type: ds.l 1
- blanker_active: ds.l 1
-
- clipping_window: ds.b clip_slen
-
- *---------------------------------------*
- cnop 0,4
- *---------------------------------------*
- text
- *---------------------------------------*
-